package com.example.administrator.exkotlin.base

import kotlin.reflect.KProperty

/**
 * Author by lp,on 2020/7/23/023,17:18.
 * Lazy函数
 * 懒加载
 * 自由当变量被首次调用的使用才会进行初始化
 * 原理，采用委托属性，对属性的赋值进行委托，在调用的时候进行赋值操作，完成一系列初始化
 * 最后一行作为返回值
 */
class Lazy {
    val p by lazy { "懒加载" }
    val p2 by Later { "自定义的懒加载" }

    //自定义懒加载函数
    class Later<T>(val block: () -> T) {
        var value: Any? = null
        //懒加载是不会对value进行赋值的，因此只需要getValue即可
        operator fun getValue(any: Any?, prop: KProperty<*>): T {
            if (value == null) {
                //lambda表达式中最后一行作为返回值
                value = block()
            }
            return value as T
        }
    }
}